package cn.lix.sc.elasticsearch.constants;

import java.util.stream.Stream;

/**
 * ES中的null值处理。避免前段有值后期为null无法更新数据做的映射
 */
public enum EsNullValue {

    /**
     * 数值类型统一定义为 -98765 为null
     */
    NUMBER(-987654, Number.class),
    /**
     * 字符类型统一定义为 “null” 为null
     */
    STRING("NULL", String.class),
    ;

    EsNullValue(Object value, Class<?> parentClass) {
        this.value = value;
        this.parentClass = parentClass;
    }

    /**
     * es null的映射值
     */
    private Object value;
    /**
     * 该类型的java父类
     */
    private Class<?> parentClass;

    public <T> T getValue() {
        return (T) value;
    }

    public Class<?> getParentClass() {
        return parentClass;
    }

    /**
     * 判断该值是否为es对应的null，是返回true
     * @param value
     * @return
     */
    public static boolean nullValue(Object value){
        if(value == null){
            return false;
        }
        return Stream.of(EsNullValue.values()).anyMatch(e -> e.parentClass.isAssignableFrom(value.getClass()) && value.equals(e.value));
    }
}
